{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tutorial Part 19: Screening Zinc For HIV Inhibition"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this tutorial we will walk through how to efficiently screen a large compound library with DeepChem (ZINC).  Screening a large compound library using machine learning is a CPU bound pleasingly parrellel problem.  The actual code examples I will use assume the resources available are a single very big machine (like an AWS c5.18xlarge), but should be readily swappable for other systmes (like a super computing cluster).  At a high level what we will do is...\n",
    "\n",
    "1. Create a Machine Learning Model Over Labeled Data\n",
    "2. Transform ZINC into \"Work-Units\"\n",
    "3. Create an inference script which runs predictions over a \"Work-Unit\"\n",
    "4. Load \"Work-Unit\" into a \"Work Queue\"\n",
    "5. Consume work units from \"Work Queue\"\n",
    "6. Gather Results\n",
    "\n",
    "This tutorial is unlike the previous tutorials in that it's designed to be run on AWS rather than on Google Colab. That's because we'll need access to a large machine with many cores to do this computation efficiently. We'll try to provide details about how to do this throughout the tutorial.\n",
    "\n",
    "# 1. Train Model On Labelled Data\n",
    "\n",
    "We are just going to knock out a simple model here.  In a real world problem you will probably try several models and do a little hyper parameter searching."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/sklearn/externals/joblib/__init__.py:15: FutureWarning: sklearn.externals.joblib is deprecated in 0.21 and will be removed in 0.23. Please import this functionality directly from joblib, which can be installed with: pip install joblib. If this warning is raised when loading pickled models, you may need to re-serialize those models with scikit-learn 0.21+.\n",
      "  warnings.warn(msg, category=FutureWarning)\n",
      "RDKit WARNING: [18:15:24] Enabling RDKit 2019.09.3 jupyter extensions\n",
      "/Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
      "/Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
      "/Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
      "/Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
      "/Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
      "/Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n",
      "/Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n",
      "/Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n",
      "/Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n",
      "/Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n",
      "/Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n",
      "/Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n",
      "  np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n"
     ]
    }
   ],
   "source": [
    "from deepchem.molnet.load_function import hiv_datasets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Loading raw samples now.\n",
      "shard_size: 8192\n",
      "About to start loading CSV from /var/folders/st/ds45jcqj2232lvhr0y9qt5sc0000gn/T/HIV.csv\n",
      "Loading shard 1 of size 8192.\n",
      "Featurizing sample 0\n",
      "Featurizing sample 1000\n",
      "Featurizing sample 2000\n",
      "Featurizing sample 3000\n",
      "Featurizing sample 4000\n",
      "Featurizing sample 5000\n",
      "Featurizing sample 6000\n",
      "Featurizing sample 7000\n",
      "Featurizing sample 8000\n",
      "TIMING: featurizing shard 0 took 12.479 s\n",
      "Loading shard 2 of size 8192.\n",
      "Featurizing sample 0\n",
      "Featurizing sample 1000\n",
      "Featurizing sample 2000\n",
      "Featurizing sample 3000\n",
      "Featurizing sample 4000\n",
      "Featurizing sample 5000\n",
      "Featurizing sample 6000\n",
      "Featurizing sample 7000\n",
      "Featurizing sample 8000\n",
      "TIMING: featurizing shard 1 took 13.668 s\n",
      "Loading shard 3 of size 8192.\n",
      "Featurizing sample 0\n",
      "Featurizing sample 1000\n",
      "Featurizing sample 2000\n",
      "Featurizing sample 3000\n",
      "Featurizing sample 4000\n",
      "Featurizing sample 5000\n",
      "Featurizing sample 6000\n",
      "Featurizing sample 7000\n",
      "Featurizing sample 8000\n",
      "TIMING: featurizing shard 2 took 13.550 s\n",
      "Loading shard 4 of size 8192.\n",
      "Featurizing sample 0\n",
      "Featurizing sample 1000\n",
      "Featurizing sample 2000\n",
      "Featurizing sample 3000\n",
      "Featurizing sample 4000\n",
      "Featurizing sample 5000\n",
      "Featurizing sample 6000\n",
      "Featurizing sample 7000\n",
      "Featurizing sample 8000\n",
      "TIMING: featurizing shard 3 took 13.173 s\n",
      "Loading shard 5 of size 8192.\n",
      "Featurizing sample 0\n",
      "Featurizing sample 1000\n",
      "Featurizing sample 2000\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "RDKit WARNING: [18:16:53] WARNING: not removing hydrogen atom without neighbors\n",
      "RDKit WARNING: [18:16:53] WARNING: not removing hydrogen atom without neighbors\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Featurizing sample 3000\n",
      "Featurizing sample 4000\n",
      "Featurizing sample 5000\n",
      "Featurizing sample 6000\n",
      "Featurizing sample 7000\n",
      "Featurizing sample 8000\n",
      "TIMING: featurizing shard 4 took 13.362 s\n",
      "Loading shard 6 of size 8192.\n",
      "Featurizing sample 0\n",
      "TIMING: featurizing shard 5 took 0.355 s\n",
      "TIMING: dataset construction took 80.394 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 16.676 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 7.529 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 7.796 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 17.521 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 7.770 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 7.873 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 15.495 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 1.959 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 1.949 s\n",
      "Loading dataset from disk.\n",
      "WARNING:tensorflow:From /Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorflow/python/ops/init_ops.py:1251: calling VarianceScaling.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Call initializer instance with the dtype argument instead of passing it to the constructor\n",
      "WARNING:tensorflow:Entity <bound method GraphConv.call of <deepchem.models.layers.GraphConv object at 0x1a3e35c048>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphConv.call of <deepchem.models.layers.GraphConv object at 0x1a3e35c048>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING: Entity <bound method GraphConv.call of <deepchem.models.layers.GraphConv object at 0x1a3e35c048>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphConv.call of <deepchem.models.layers.GraphConv object at 0x1a3e35c048>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING:tensorflow:Entity <bound method GraphPool.call of <deepchem.models.layers.GraphPool object at 0x1a41856e80>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphPool.call of <deepchem.models.layers.GraphPool object at 0x1a41856e80>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING: Entity <bound method GraphPool.call of <deepchem.models.layers.GraphPool object at 0x1a41856e80>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphPool.call of <deepchem.models.layers.GraphPool object at 0x1a41856e80>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING:tensorflow:Entity <bound method GraphConv.call of <deepchem.models.layers.GraphConv object at 0x1a49f5aa90>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphConv.call of <deepchem.models.layers.GraphConv object at 0x1a49f5aa90>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING: Entity <bound method GraphConv.call of <deepchem.models.layers.GraphConv object at 0x1a49f5aa90>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphConv.call of <deepchem.models.layers.GraphConv object at 0x1a49f5aa90>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING:tensorflow:Entity <bound method GraphPool.call of <deepchem.models.layers.GraphPool object at 0x1a43f5d198>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphPool.call of <deepchem.models.layers.GraphPool object at 0x1a43f5d198>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING: Entity <bound method GraphPool.call of <deepchem.models.layers.GraphPool object at 0x1a43f5d198>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphPool.call of <deepchem.models.layers.GraphPool object at 0x1a43f5d198>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING:tensorflow:Entity <bound method GraphGather.call of <deepchem.models.layers.GraphGather object at 0x1a43f3a940>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphGather.call of <deepchem.models.layers.GraphGather object at 0x1a43f3a940>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING: Entity <bound method GraphGather.call of <deepchem.models.layers.GraphGather object at 0x1a43f3a940>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphGather.call of <deepchem.models.layers.GraphGather object at 0x1a43f3a940>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING:tensorflow:From /Users/bharath/Code/deepchem/deepchem/models/layers.py:222: The name tf.unsorted_segment_sum is deprecated. Please use tf.math.unsorted_segment_sum instead.\n",
      "\n",
      "WARNING:tensorflow:From /Users/bharath/Code/deepchem/deepchem/models/layers.py:224: The name tf.unsorted_segment_max is deprecated. Please use tf.math.unsorted_segment_max instead.\n",
      "\n",
      "WARNING:tensorflow:Entity <bound method TrimGraphOutput.call of <deepchem.models.graph_models.TrimGraphOutput object at 0x1a41a9ecf8>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method TrimGraphOutput.call of <deepchem.models.graph_models.TrimGraphOutput object at 0x1a41a9ecf8>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING: Entity <bound method TrimGraphOutput.call of <deepchem.models.graph_models.TrimGraphOutput object at 0x1a41a9ecf8>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method TrimGraphOutput.call of <deepchem.models.graph_models.TrimGraphOutput object at 0x1a41a9ecf8>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING:tensorflow:From /Users/bharath/Code/deepchem/deepchem/models/keras_model.py:169: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.\n",
      "\n",
      "WARNING:tensorflow:From /Users/bharath/Code/deepchem/deepchem/models/optimizers.py:76: The name tf.train.AdamOptimizer is deprecated. Please use tf.compat.v1.train.AdamOptimizer instead.\n",
      "\n",
      "WARNING:tensorflow:From /Users/bharath/Code/deepchem/deepchem/models/keras_model.py:258: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /Users/bharath/Code/deepchem/deepchem/models/keras_model.py:260: The name tf.variables_initializer is deprecated. Please use tf.compat.v1.variables_initializer instead.\n",
      "\n",
      "WARNING:tensorflow:Entity <bound method GraphConv.call of <deepchem.models.layers.GraphConv object at 0x1a3e35c048>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphConv.call of <deepchem.models.layers.GraphConv object at 0x1a3e35c048>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING: Entity <bound method GraphConv.call of <deepchem.models.layers.GraphConv object at 0x1a3e35c048>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphConv.call of <deepchem.models.layers.GraphConv object at 0x1a3e35c048>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING:tensorflow:Entity <bound method GraphPool.call of <deepchem.models.layers.GraphPool object at 0x1a41856e80>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphPool.call of <deepchem.models.layers.GraphPool object at 0x1a41856e80>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING: Entity <bound method GraphPool.call of <deepchem.models.layers.GraphPool object at 0x1a41856e80>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphPool.call of <deepchem.models.layers.GraphPool object at 0x1a41856e80>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING:tensorflow:Entity <bound method GraphConv.call of <deepchem.models.layers.GraphConv object at 0x1a49f5aa90>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphConv.call of <deepchem.models.layers.GraphConv object at 0x1a49f5aa90>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING: Entity <bound method GraphConv.call of <deepchem.models.layers.GraphConv object at 0x1a49f5aa90>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphConv.call of <deepchem.models.layers.GraphConv object at 0x1a49f5aa90>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING:tensorflow:Entity <bound method GraphPool.call of <deepchem.models.layers.GraphPool object at 0x1a43f5d198>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphPool.call of <deepchem.models.layers.GraphPool object at 0x1a43f5d198>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING: Entity <bound method GraphPool.call of <deepchem.models.layers.GraphPool object at 0x1a43f5d198>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphPool.call of <deepchem.models.layers.GraphPool object at 0x1a43f5d198>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING:tensorflow:Entity <bound method GraphGather.call of <deepchem.models.layers.GraphGather object at 0x1a43f3a940>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphGather.call of <deepchem.models.layers.GraphGather object at 0x1a43f3a940>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING: Entity <bound method GraphGather.call of <deepchem.models.layers.GraphGather object at 0x1a43f3a940>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method GraphGather.call of <deepchem.models.layers.GraphGather object at 0x1a43f3a940>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING:tensorflow:Entity <bound method TrimGraphOutput.call of <deepchem.models.graph_models.TrimGraphOutput object at 0x1a41a9ecf8>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method TrimGraphOutput.call of <deepchem.models.graph_models.TrimGraphOutput object at 0x1a41a9ecf8>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING: Entity <bound method TrimGraphOutput.call of <deepchem.models.graph_models.TrimGraphOutput object at 0x1a41a9ecf8>> could not be transformed and will be executed as-is. Please report this to the AutgoGraph team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output. Cause: converting <bound method TrimGraphOutput.call of <deepchem.models.graph_models.TrimGraphOutput object at 0x1a41a9ecf8>>: AttributeError: module 'gast' has no attribute 'Num'\n",
      "WARNING:tensorflow:From /Users/bharath/Code/deepchem/deepchem/models/losses.py:108: The name tf.losses.softmax_cross_entropy is deprecated. Please use tf.compat.v1.losses.softmax_cross_entropy instead.\n",
      "\n",
      "WARNING:tensorflow:From /Users/bharath/Code/deepchem/deepchem/models/losses.py:109: The name tf.losses.Reduction is deprecated. Please use tf.compat.v1.losses.Reduction instead.\n",
      "\n",
      "WARNING:tensorflow:From /Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorflow/python/ops/math_grad.py:318: add_dispatch_support.<locals>.wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.where in 2.0, which has the same broadcast rule as np.where\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorflow/python/ops/gradients_util.py:93: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n",
      "  \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n",
      "/Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorflow/python/ops/gradients_util.py:93: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n",
      "  \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n",
      "/Users/bharath/opt/anaconda3/envs/deepchem/lib/python3.6/site-packages/tensorflow/python/ops/gradients_util.py:93: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n",
      "  \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.0"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from deepchem.models import GraphConvModel\n",
    "from deepchem.data import NumpyDataset\n",
    "from sklearn.metrics import average_precision_score\n",
    "import numpy as np\n",
    "\n",
    "tasks, all_datasets, transformers = hiv_datasets.load_hiv(featurizer=\"GraphConv\")\n",
    "train, valid, test = [NumpyDataset.from_DiskDataset(x) for x in all_datasets]\n",
    "model = GraphConvModel(1, mode=\"classification\")\n",
    "model.fit(train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average Precision Score:0.19783388433313015\n",
      "Hit Rate Top 100: 0.37\n"
     ]
    }
   ],
   "source": [
    "y_true = np.squeeze(valid.y)\n",
    "y_pred = model.predict(valid)[:,0,1]\n",
    "print(\"Average Precision Score:%s\" % average_precision_score(y_true, y_pred))\n",
    "sorted_results = sorted(zip(y_pred, y_true), reverse=True)\n",
    "hit_rate_100 = sum(x[1] for x in sorted_results[:100]) / 100\n",
    "print(\"Hit Rate Top 100: %s\" % hit_rate_100)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Retrain Model Over Full Dataset For The Screen"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Loading raw samples now.\n",
      "shard_size: 8192\n",
      "About to start loading CSV from /tmp/HIV.csv\n",
      "Loading shard 1 of size 8192.\n",
      "Featurizing sample 0\n",
      "Featurizing sample 1000\n",
      "Featurizing sample 2000\n",
      "Featurizing sample 3000\n",
      "Featurizing sample 4000\n",
      "Featurizing sample 5000\n",
      "Featurizing sample 6000\n",
      "Featurizing sample 7000\n",
      "Featurizing sample 8000\n",
      "TIMING: featurizing shard 0 took 15.701 s\n",
      "Loading shard 2 of size 8192.\n",
      "Featurizing sample 0\n",
      "Featurizing sample 1000\n",
      "Featurizing sample 2000\n",
      "Featurizing sample 3000\n",
      "Featurizing sample 4000\n",
      "Featurizing sample 5000\n",
      "Featurizing sample 6000\n",
      "Featurizing sample 7000\n",
      "Featurizing sample 8000\n",
      "TIMING: featurizing shard 1 took 15.869 s\n",
      "Loading shard 3 of size 8192.\n",
      "Featurizing sample 0\n",
      "Featurizing sample 1000\n",
      "Featurizing sample 2000\n",
      "Featurizing sample 3000\n",
      "Featurizing sample 4000\n",
      "Featurizing sample 5000\n",
      "Featurizing sample 6000\n",
      "Featurizing sample 7000\n",
      "Featurizing sample 8000\n",
      "TIMING: featurizing shard 2 took 19.106 s\n",
      "Loading shard 4 of size 8192.\n",
      "Featurizing sample 0\n",
      "Featurizing sample 1000\n",
      "Featurizing sample 2000\n",
      "Featurizing sample 3000\n",
      "Featurizing sample 4000\n",
      "Featurizing sample 5000\n",
      "Featurizing sample 6000\n",
      "Featurizing sample 7000\n",
      "Featurizing sample 8000\n",
      "TIMING: featurizing shard 3 took 16.267 s\n",
      "Loading shard 5 of size 8192.\n",
      "Featurizing sample 0\n",
      "Featurizing sample 1000\n",
      "Featurizing sample 2000\n",
      "Featurizing sample 3000\n",
      "Featurizing sample 4000\n",
      "Featurizing sample 5000\n",
      "Featurizing sample 6000\n",
      "Featurizing sample 7000\n",
      "Featurizing sample 8000\n",
      "TIMING: featurizing shard 4 took 16.754 s\n",
      "Loading shard 6 of size 8192.\n",
      "Featurizing sample 0\n",
      "TIMING: featurizing shard 5 took 0.446 s\n",
      "TIMING: dataset construction took 98.214 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 21.127 s\n",
      "Loading dataset from disk.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/leswing/miniconda3/envs/deepchem/lib/python3.6/site-packages/tensorflow/python/ops/gradients_impl.py:100: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n",
      "  \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n"
     ]
    }
   ],
   "source": [
    "tasks, all_datasets, transformers = hiv_datasets.load_hiv(featurizer=\"GraphConv\", split=None)\n",
    "\n",
    "model = GraphConvModel(1, mode=\"classification\", model_dir=\"/tmp/zinc/screen_model\")\n",
    "model.fit(all_datasets[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. Create Work-Units\n",
    "\n",
    "1. Download All of ZINC15.\n",
    "\n",
    "Go to http://zinc15.docking.org/tranches/home and download all non-empty tranches in .smi format.\n",
    "I found it easiest to download the wget script and then run the wget script.\n",
    "For the rest of this tutorial I will assume zinc was downloaded to /tmp/zinc.\n",
    "\n",
    "\n",
    "The way zinc downloads the data isn't great for inference.  We want \"Work-Units\" which a single CPU can execute that takes a resonable amount of time (10 minutes to an hour).  To accomplish this we are going to split the zinc data into files each with 500 thousand lines.\n",
    "\n",
    "\n",
    "```bash\n",
    "mkdir /tmp/zinc/screen\n",
    "find /tmp/zinc -name '*.smi' -exec cat {} \\; | grep -iv \"smiles\" \\\n",
    "     | split -l 500000 /tmp/zinc/screen/segment\n",
    "```\n",
    "\n",
    "This bash command\n",
    "1. Finds all smi files\n",
    "2. prints to stdout the contents of the file\n",
    "3. removes header lines\n",
    "4. splits into multiple files in /tmp/zinc/screen that are 500k molecules long"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Creat Inference Script\n",
    "\n",
    "Now that we have work unit we need to construct a program which ingests a work unit and logs the result.  It is important that the logging mechanism is thread safe!\n",
    "For this example we will get the work unit via a file-path, and log the result to a file.\n",
    "An easy extensions to distribute over multiple computers would be to get the work unit via a url, and log the results to a distributed queue.\n",
    "\n",
    "Here is what mine looks like\n",
    "\n",
    "inference.py\n",
    "```python\n",
    "import sys\n",
    "import deepchem as dc\n",
    "import numpy as np\n",
    "from rdkit import Chem\n",
    "import pickle\n",
    "import os\n",
    "\n",
    "\n",
    "def create_dataset(fname, batch_size=50000):\n",
    "    featurizer = dc.feat.ConvMolFeaturizer()\n",
    "    fin = open(fname)\n",
    "    mols, orig_lines = [], []\n",
    "    for line in fin:\n",
    "        line = line.strip().split()\n",
    "        try:\n",
    "            mol = Chem.MolFromSmiles(line[0])\n",
    "            if mol is None:\n",
    "                continue\n",
    "            mols.append(mol)\n",
    "            orig_lines.append(line)\n",
    "        except:\n",
    "            pass\n",
    "        if len(mols) > 0 and len(mols) % batch_size == 0:\n",
    "            features = featurizer.featurize(mols)\n",
    "            y = np.ones(shape=(len(mols), 1))\n",
    "            ds = dc.data.NumpyDataset(features, y)\n",
    "            yield ds, orig_lines\n",
    "            mols, orig_lines = [], []\n",
    "    if len(mols) > 0:\n",
    "        features = featurizer.featurize(mols)\n",
    "        y = np.ones(shape=(len(mols), 1))\n",
    "        ds = dc.data.NumpyDataset(features, y)\n",
    "        yield ds, orig_lines\n",
    "\n",
    "\n",
    "def evaluate(fname):\n",
    "    fout_name = \"%s_out.smi\" % fname\n",
    "    model = dc.models.TensorGraph.load_from_dir('screen_model')\n",
    "    for ds, lines in create_dataset(fname):\n",
    "        y_pred = np.squeeze(model.predict(ds), axis=1)\n",
    "        with open(fout_name, 'a') as fout:\n",
    "            for index, line in enumerate(lines):\n",
    "                line.append(y_pred[index][1])\n",
    "                line = [str(x) for x in line]\n",
    "                line = \"\\t\".join(line)\n",
    "                fout.write(\"%s\\n\" % line)\n",
    "\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "    evaluate(sys.argv[1])\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. Load \"Work-Unit\" into a \"Work Queue\"\n",
    "\n",
    "We are going to use a flat file as our distribution mechanism.  It will be a bash script calling our inference script for every work unit.  If you are at an academic institution this would be queing your jobs in pbs/qsub/slurm.  An option for cloud computing would be rabbitmq or kafka."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "work_units = os.listdir('/tmp/zinc/screen')\n",
    "with open('/tmp/zinc/work_queue.sh', 'w') as fout:\n",
    "    fout.write(\"#!/bin/bash\\n\")\n",
    "    for work_unit in work_units:\n",
    "        full_path = os.path.join('/tmp/zinc', work_unit)\n",
    "        fout.write(\"python inference.py %s\" % full_path)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. Consume work units from \"distribution mechanism\"\n",
    "\n",
    "We will consume work units from our work queue using a very simple Process Pool.  It takes lines from our \"Work Queue\" and runs them, running as many processes in parrallel as we have cpus.  If  you are using a supercomputing cluster system like pbs/qsub/slurm it will take care of this for you.  The key is to use one CPU per work unit to get highest throughput.  We accomplish that here using the linux utility \"taskset\".\n",
    "\n",
    "Using an c5.18xlarge on aws this will finish overnight. \n",
    "\n",
    "process_pool.py\n",
    "```python\n",
    "import multiprocessing\n",
    "import sys\n",
    "from multiprocessing.pool import Pool\n",
    "\n",
    "import delegator\n",
    "\n",
    "\n",
    "def run_command(args):\n",
    "  q, command = args\n",
    "  cpu_id = q.get()\n",
    "  try:\n",
    "    command = \"taskset -c %s %s\" % (cpu_id, command)\n",
    "    print(\"running %s\" % command)\n",
    "    c = delegator.run(command)\n",
    "    print(c.err)\n",
    "    print(c.out)\n",
    "  except Exception as e:\n",
    "    print(e)\n",
    "  q.put(cpu_id)\n",
    "\n",
    "\n",
    "def main(n_processors, command_file):\n",
    "  commands = [x.strip() for x in open(command_file).readlines()]\n",
    "  commands = list(filter(lambda x: not x.startswith(\"#\"), commands))\n",
    "  q = multiprocessing.Manager().Queue()\n",
    "  for i in range(n_processors):\n",
    "    q.put(i)\n",
    "  argslist = [(q, x) for x in commands]\n",
    "  pool = Pool(processes=n_processors)\n",
    "  pool.map(run_command, argslist)\n",
    "\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "  processors = multiprocessing.cpu_count()\n",
    "  main(processors, sys.argv[1])\n",
    "```\n",
    "\n",
    "\n",
    "```bash\n",
    ">> python process_pool.py /tmp/zinc/work_queue.sh\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 6. Gather Results\n",
    "Since we logged our results to \\*_out.smi we now need to gather all of them up and sort them by our predictions.  The resulting file wile be > 40GB.  To analyze the data further you can use dask, or put the data in a rdkit postgres cartridge.\n",
    "\n",
    "Here I show how to join the and sort the data to get the \"best\" results.\n",
    "\n",
    "```bash\n",
    "find /tmp/zinc -name '*_out.smi' -exec cat {} \\; > /tmp/zinc/screen/results.smi\n",
    "sort -rg -k 3,3 /tmp/zinc/screen/results.smi > /tmp/zinc/screen/sorted_results.smi\n",
    "# Put the top 100k scoring molecules in their own file\n",
    "head -n 50000 /tmp/zinc/screen/sorted_results.smi > /tmp/zinc/screen/top_100k.smi\n",
    "```\n",
    "\n",
    "/tmp/zinc/screen/top_100k.smi is now a small enough file to investigate using standard tools like pandas."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "from rdkit import Chem\n",
    "from rdkit.Chem.Draw import IPythonConsole\n",
    "from IPython.display import SVG\n",
    "from rdkit.Chem.Draw import rdMolDraw2D \n",
    "best_mols = [Chem.MolFromSmiles(x.strip().split()[0]) for x in open('/tmp/zinc/screen/top_100k.smi').readlines()[:100]]\n",
    "best_scores = [x.strip().split()[2] for x in open('/tmp/zinc/screen/top_100k.smi').readlines()[:100]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.98874843\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcIAAACWCAIAAADCEh9HAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3deVyU1RoH8N9s7KgIKggigspmEKGigmFX1CxX3K4loZiYV3MvSjOrjwt2XbiWJVSaqelFRMRMC27uK2apCDMqiyKiKYuALDPMnPvHa+M4LILMzDvK8/3cP+jM+J5nLh8fz5ztETDGQAgh5GkJ+Q6AEEKebZRGCSGkWSiNEkJIs1AaJYSQZqE0SgghzUJpVMd27tyZkJDAdxSEEMMR0IYnHTp//nxQUFBVVdXp06d79+7NdziEEEOg0ajOFBYWjh07trKyMjw8nHIoIS0HjUZ1Q6FQDB48+PDhw3379j106JCpqSnfERFCDIRGo7oxZ86cw4cPOzg4JCQkUA4lpEWhNKoDW7Zs+frrr83MzJKSkjp27Mh3OIQQg6I02lynTp2aPn06gA0bNtCUKCEtEKXRZikoKBg3blx1dfXcuXMjIiL4DocQwgNaYnp6VVVVAwYMOHPmzMCBAw8ePCgWi/mOiBDCAxqNPr1Zs2adOXOmc+fOO3bsoBxKSItFafQp/ec///nuu+/Mzc0TExPbtWvHdziEEN7Ql/qncfz48YEDByoUih07dkyYMIHvcAghfKLRaJNdv349NDRULpd/+OGHlEMJITQabZrKysr+/fv//vvvQ4YM2b9/v0gk4jsiQgjPaDTaBIyxiIiI33//vXv37jt37qQcSggBpdEmWbVq1c6dO62trRMTE9u0acN3OIQQo0Bf6hvr119/fe211xhjSUlJw4cP5zscQoixoNFoo1y5cmXChAlKpfLTTz+lHGpESksxdSocHdGxI157Ddeu8R0QaYkojT5ZWVlZaGhoSUnJqFGjFi9ezHc4RMPkyZBIkJuL/HyMHo3Bg1FdzXdMpMV5tr/UL1261Nzc3N3d3dPT083NTSKR6LwLxtj48eMTEhI8PT1Pnz7dqlUrnXdBnlJmJoKDceMGzMwetgwahDfewJQpvIZFWpxn+AgjY2zt2rXl5eXcf4rFYmdnZ1dXVy8vL29vb1dXVx8fn/bt2zezl6VLlyYkJLRt2zY5OZlyqHFJT4ePz6McCiAgAOnp/AVEWqhnOI3W1NSsXbtWJpNlZGTIZLLc3Nzs7Ozs7OzU1FT1exwcHDw9PbnhqoeHh7u7u7Ozc+O72Lt377Jly0Qi0bZt27p27aqHD0GagTEIBE9oIUT/nu0v9ZrkcvnNmzcvX76ckZGRnZ19+fLlCxcuqMeqaqampm5ubtxwlRu3enp6WlhY1H6gVCoNCAgoLS1ds2bN/PnzDfIhSFPQl3piHJ6fNFqnW7duqbMq90NOTk7tj+zg4ODt7a2eDfD29jYzM+vdu/e1a9fefPPNbdu28RI8ebJRo+DggPXrIRbj22+xYgUyM2Fmht9/R+fOsLPjOz7SIjznabS24uJiqVSamZkpk8m4H3JycmpqarTeZmFhUVFR4e/vf+zYMXNzc15CJU9WUoJ58/DLLwDg44P169G9O+bPx7p1iI5GVBTf8ZEWocWl0doUCkVeXp7mbMClS5cqKysBJCUlvfbaa3wHSJ5EpUJVFdQzM/v3Y9gwdO8OqZSmSokBUBqt2/Tp0+Pi4v71r39t2LCB71hIg5KTMXs23nwTy5c/bFEq0aUL8vJw7BiCgngNjrQItP2+bu+++y6A7du3V1RU8B0LaVDbtrh+HVu2QKl82CISYdIkANi0ice4SMtBabRuPXr06N279/379/fs2cN3LKRBQUHw8EB+/sMZUs7bb0MgQHw8ysr4i4y0FJRG68VV+txEIxrjN3kyAHz33aMWV1e8/DIePEB8PE8xNcrGjRsnTJjg5uY2aNCgOXPmxMXFpaam3rlzh++4SNPQ3Gi9SktLHRwcKisrr1696ubmxnc4pH537qBTJzCGvDzY2z9s/OEHhIejb1+cPMlrcPVas2bNwoULLS0tHzx4oPVShw4duAMjas7OzgJaLjNWlEYbEh4e/sMPPyxZsuSzzz7jOxbSoBEjsG8f1qyB+qBEZSU6dkRJCS5fhpcXr8HVITU1dejQoUql8scff+zdu7fmRpGLFy+W1ZqLMDEx6dq1q+axEQ8PD0tLS16CJ1oojTbkyJEjAwYMcHJyys3NpbvujdrevRg1Ch4eyMx81Dh9OuLisHAh/v1v/iKrQ25ubq9eve7du/fJJ58sXbq09huKi4u5xNqYYyOa90i4uroa5BOQx1AabQhjrHv37teuXTtw4MCrr77KdziNVV1dbWpqyncUhlVTA2dnFBTg1Cn06fOw8exZBASgfXvcvAk93P71dMrLy/v27Zuenj5y5MjExEShsFHrEyUlJTKZLDMzUyqVcvdIZGdn1z42Ymdnp54H8PT07Nu3r42NjR4+BHkcIw1avnw5gHHjxvEdSKNkZmauW7cOgIODQ0hISGRkZExMTEpKyq1bt/gOTf/ee48BbNq0xxp9fBjAEhN5ikmbSqUaP348AA8Pj5KSkuY8SqFQZGVlpaSkxMTEREZGBgYG1r6BbNWqVdevX9dV8KQ+NBp9gvz8/M6dO4tEops3b7Zr147vcBpy//79gIAAmUwmFApVKpXWq3Z2duprrrgfuM/FS6h6ceUKPDxgaYmCAlhZPWyMicG8edX//Kfpjh28BvfQZ599tnTpUhsbmzNnznTr1k3nz8/Pz+eGq5mZmXv37s3Ly1u0aNFy9cEEoid85/FnwOuvvw5g3bp1fAfSEKVSOWzYMAC+vr7FxcVPHKcAkEgkrq6uw4YNi4qKio2NPXbsWFlZGd+fo3kCAxnANm9WNyj/+mtpnz5mJib5+fn8hfXQ3r17hUKhUCjcv3+/ZrtKpdJHd0ePHgXg6OhYU1Ojj+cTNUqjT3Y4Ofl0cHB1cDDfgTTkww8/BNC2bdusrKw631BUVHTs2LHY2NioqKhhw4a5urrWOStnY2MTGBiong3IysrS019yvfjuOwaw/v0128aOHQtg5cqVfAXFkUqlrVu3BrBq1SrN9tzcXB8fn1OnTumjUw8PDwBaWZvoHKXRRlAomL09A9jZs3yHUrfdu3cLBAKxWPzbb781/k+VlpampaVt3bp10aJFY8aM8fb2NjExqZ1Y27RpExAQMGXKlOjo6H379unvU+hAWVlmSEi4l5dMJlO3/fzzzwC6devG478H9+/f9/LyAjBmzBjNMMrLy318fLh2ffQbHR0NIDQ0VB8PJ2qURhtnwQIGsHfe4TuOOly4cIHbP7h+/fpmPkpr1SIkJMRevZsdANC1a9cNGzboJGw9mTp1KoAPPvhA3aJUKjt16gTgyJEjvISkVCq5eSFfX9/y8nJ1u0qlmjBhAgB3d/dmLjfV5/bt2xKJRCKR3LlzRx/PJxxKo42TmckA1ro1e/CA71AeU1hYyJ2wCgsL01MXd+7cOXz4cGxs7OzZs83MzABkZGToqa/mO3HiBAB7e3u5XK5u5Oq5hoeH8xJSVFQUAFtbW635lmXLlgGwtra+fPmy/nrn6oGvWbNGf10QSqON1qcPA9gPP/AdxyM1NTVDhgwB8NJLL1VUVKjblUqlQqHQR4/Tpk0D8N577+nj4brCfX1OTk5Wt2RnZwuFQnNz8+LiYgMHU998y8GDB0UikVAo1O08SVJS0tChQzXzdVJSEgAPDw8d9kK0UBpttLg4BrABA/iO45E5c+ZwI6+8vDzN9sWLF7/88sv6+B53+vRpAB06dNAc6xmbzz//HMCoUaM0G1955RUAcXFxhozkzz//5OZbvvjiC812mUzWpk0bACtWrNBtj2FhYQCWLFmiblEoFA4ODgBOnz6t276IGqXRRisrY1ZWTCBgV6/yHQpjjP3www/cpqWjR49qtickJHDDn0OHDumjX25JZM+ePfp4uE5wE4JisVjz0MHWrVsBBAQEGCyMwsJC7mjmW2+9pdleWlrKjZdDQ0N1vup16NAhAE5OTpqbnN577z0A07QOJhDdoTTaFJMnM4AtWsR3HOz333/nKkRpDa8yMjK4LaIxMTF66nrNmjUAhg8frqfn68SoUaMAfP755+qWiooKbgB44cIFAwSgUCi48W+fPn2qqqrU7ertvT4+PprLTbqiUqm4SuAHDx5UN8pkMoFAYGVl9czvCzZWlEab4uhRBjBHR8brfubbt287OTkBmDlzpma7AZabGGP37t0zNTUVi8XGsKG9Pvv27QPQvXt3zeHeO++8A2D+/PkGCGD27NncfMvNmzc12xctWsRt77127Zqeuq7z+HK/fv0AfP/993rqtIWjNNpEHh4MYPztZ5bL5S+//DKAwMDA6upqdXtNTQ13eYqfn5/mclMz3b17d+7cuVobD8eMGQMgOjpaV73onEKh6NixI4Djx4+rG9PS0rgVc83hoT7UN9+SmJgoEAhEIpHmUFHnbt68KRKJTExM/vrrL3Xjd999B6D/4wcTiK5QGm2i6GgGMP72M0dGRgJwdnbWWkGaN28et/ijtdzUTGVlZdbW1gAyMzPVjfv376891jM2H3zwAYCIiAjNRl9fXwC7d+/WX788zreoceVsNTsqLy+v/XskukJptIlu32YSCROLWUGB4Tv/6quvAJiZmZ19/DwVt34ikUj0scN8ypQpAD788EN1i3pDu9Zoy6hkZWUJBAJLS8vS0tLq6urc3Nyvv/76008/jYmJ0cekJEc93zJr1izNdsPMt6jt3r0bQI8ePTQbuaI4mgcTiK5QGm26KVPY3LmGT6MnTpzgDmtu1rh6gzF2/vx5CwsLALGxsfro9/jx49w0n+ZeVG6Ob/LkyfroUVe42Y9vvvlm4sSJfdSXkAKtW7f29/cfN27c0qVL4+Pjz507V1lZ2fzunjjforW9V3/kcnn79u0BpKWlqRvrPJhAdILS6LPhxo0b3F8Mra3vt2/f5gaGM2bM0F/vnp6eADQ3imdnZ3Njvfv37+uv32bavn37qFGjZsyYAcDS0nLs2LH9+vVr27Zt7XsDJBKJh4fH6NGjP/zwwy1btpw5c+YpTmfWN98yd+5cfcy3NGz+/PkA3nn8+DL3e9Q8mEB0gtJo092/zyIiWMeOzMGBDR1qgG2klZWVvXr1AjBo0CDN/YByuTw4OBhAv379NIc/Ordq1SoAo0eP1mwcMGCA4Te0N9Wvv/4qEokEAkFCQoK6saio6Ny5c1u2bImKiho3bpyXl1ed966qL7uKjo5OTk7OyspSKpX1dbRhwwZuvkVzAMj0PN/SgMzMTG7c/UDj+HKdBxNI81EabbrRo9n06UwuZyoVi4tjXbowPa/8crOTLi4ud+/e1WyfPn06gI4dO+p775F6Q3uBxlQGtx7dp08fvXbdHNnZ2ba2tgA+++yzht9ZXV2dlZWVnJwcHR0dFhbm7+9vpb74WYOpqamXl9e4ceOioqK2bNly7tw5Lkmp51t+/PFHzcfqe76lYQEBAQC2bt2qbqnzYAJpPkqjTZSRwdq1Y5pTaSEhbNMm/XW4evVqAFZWVpcuXdJs37x5c53LTXoycuRIAP/+97/VLeoN7enp6QYIoKnKysp69OjBDb6eYkeBUqnMzs4+cODA2rVrIyMjg4OD66x9IBKJ3NzcuEXwhQsXaj7BMPMtDYiLiwPwyiuvaDbWPphAmo/SaBPFx7OBAx9rWbyYzZ/P3nqLeXmxceNYVBTbsoWdO6eTu6BSUlLEYrFAIIiPj9dsP3nyJFe07rvvvmt+L42xd+9eAO7u7rU3tC9YsMAwMTSeSqXibmv29PTU4extcXHxuXPn4uPjly5dys0GiMVibj609iXzZWVl3GysXudbGlBWVmZlZSUQCK5qzDslJyfX/j2SZqI02kT//S8LCXmsZdEitmAB8/VlgPb/HBxYSAibPZvFxrKUlKYu7ufk5NjZ2QFYunSpZvutW7e4veWGOZDDUW9oP3nypLrx7NmzAOzs7PS9ob2pPv74Y25y86qeZ66rq6tPnz5tbm4uFApzc3O1XlWpVPwuwYWHhwNYvHixukX9ezxx4gSPgT1nKI02UX1f6gsL2cmT7Ntv2XvvseHDWdeuTCSqnVgzevYMDg6OjIxcu3btgQMHsrOz61u1KCsre+GFFwCMHDlS8z2VlZW9e/cGMHDgQD3dhlcf7t7Mt99+W7PRABvamyopKYkrefTzzz8bpsc33ngDwCeffGKY7hrvyJEjqFWOiTuYMHXqVB4De85QGm26kSPZO+88WmJycWF17jqUy1lWFktOZtHRLDKSBQYya+v4vn21JtdMTEzUdeW4VYuysjJ1Gd7a96Jzm6hrLzcZgPqGi9LSUnUjV8/59ddfN3Aw9cnMzORKHq1evdpgnaampgLo3LlzA0v5fOHKMWn+i1Ln75E0B6XRpisuZpMnMwcH5uDAhgxhGmV/nqjoxo1ff/11/fr1M2bM+Mc//sF9vdIiFAq5LaJt2rS5cuWK5h9fv349AEtLS8NcU1RbUFAQgE0aS2rcTSUikejGjRu8hKSpqKiIu9/ozTffNGS/KpWKO6SUkpJiyH4bY+XKlahV66l///6GnFh/7lEa5VlJSYnmqoW/vz93Irt169ZaK7+MMZlM5unp+d///peXUBljmzZtAhAUFKTZOG7cOADLly/nKyqOUqnkzpK/+OKLDwxe6+Wzzz4DMHHiRAP3+0QFBQVisVjrphJum0dgYCCPgT1PKI0aHblczv2d1NqqwuFr2ZdTXl7O3a+hWY7pwIEDAFxdXfld/OUuJ7a1tc3OzjZ873l5eSKRyNTU1PCTLU/E3XC6du1adUudv0fy1OqoVE74JZFI5syZY2Fhcfjw4aysLK1X66yBbDCWlpbcpO3333+vbhw8eLCzs3N2dvbRo0f5Cmz37t2rV6+WSCQJCQldunQxfABOTk4hISHV1dU7d+40fO8Nmzp1qkQiuXnzprrF0tKSK0qq+XskT4/vPE7q9tZbbwH46KOP+A5E28mTJ1GrHNOSJUtQq1qGwfzxxx/cYaGvvvqKlwA48fHxAHx8fHiMoU5yubyg1ma7U6dO1f49kqcjYIzxmcVJPY4ePRocHOzo6Hj9+vU6T3zzyNvbOyMjY+/evSNGjOBacnJyunbtampqeuvWLe5ok8EUFhb26tUrJycnPDyc37GVXC53cnK6e/fu+fPn/fz8eIykkVxcXG7duuXm5ubn5+fl5eX+N+5kB2kCvvM4qVftrSpGgjufOmLECM3Gf/zjHwA2btxoyEgUCgV3Q0rfvn2N4QgAV6tVq7iLcTp+/LhEIuGOsWrijre+/vrrCxcu/Oabb44dO6a8d4/vYI0dpVHjtWLFCgBjx47lOxBtd+/e5coxad5wsW3bNgC9e/c2ZCQzZ84E4ODgoFXyiC+XLl0C0Lp1a8PcK/rU1AfhZs6cqbVRxMzMTDOr2llYMKGQ2dgwf38WFsaio1l8PEtP57ccmbGhNGq86tyqYiRCQ0M9PDw0S59XVlba2NgA+PPPPw0Tw5YtWwCYmZkZVQX2nj17otZVT0al4YNw1dXVGRkZu3fvXrFiRVhY2HsjRrBWreo46Gxqynx82PjxbMkS9vvv9d4eaWrK1OVI09KYt7cBP6jhUBo1atxWlXXr1vEdiLY6j4r/61//AjBv3jwDBHDq1CluCu/bb781QHeN9/XXX3MZiu9A6jV16lQ09SBcURE7dozFxrKoKDZsGHN1ZULho5S6cWO9t0dSGiW8S0xMRK2iOkaLKzdiaWmpPt4aGxt77NgxnZdHLygocHR0BDBnzhzdPrn5SkpKLCwsBAKB/kooNwd3eNfKyurixYvNelBpKUtLY1u3skWLWHJyvbdHUholvFMoFPb29gDOnDnDdyxPoFKpuK2IAoFAa9VCIBC4uLgMGTJk7ty5GzduPHTokFaZjSaRy+XcmdSgoCB+DyPUZ9KkSQA+/vhjvgPRlpqayt27qOODcPXdHskYMzVlzs6sc2fWuTNzcKA0SvixcOFCANOnT+c7kCfgzm5bW1ufP38+PT299vFWLW3atHm6unJvv/02gM6dOxvhlDHn0KFDAJycnGqMaR0mNzeXu3la95uR67s9ktFolBgHqVQqEAhatWpl+HPijffLL7+IRCKhUFhnuTSFQpGVlZWSkhITExMZGRkSEtKhQ4faiVUikWjNBtSegeUuZzE3Nz937pxBPtnTUKlU3A0pBw8e5DuWhyoqKvz9/QEMGTJE98m9gZIQlEaJkejbty+ALVu28B1I3WQyGbflftmyZY3/U7dv3z506NDGjRvnzp07ZMgQFxeX2rMB+PuQ5cyZM7/88st169aZmJgIBIIdO3bo7+PoxLJlywCMHz+e70AY05hvcXd3Ly4u1ksf9d0eSWmUGIlvvvkGQHBwMN+B1KG0tNTb2xtPW/JIU3V1NTcboK4rZ2lpqTXHKhQKtUpMG6ebN2+KRCIj2ay2fPlybr7l8uXL+uqjvtsjKY0SI1FWVmZtbS0QCLSuH+WdnkoeqSmVyqysrJ9//nn16tXTpk3jynxqlko2ZtytfTExMfyGoZ5v2bdvH7+RPMcojT4buBrLixYt4juQx3A3krRt21bfJY84a9euBTBs2DCt9qKiIq2yqcYgISEBwAsvvMBjDOr5Ft5vg32+URp9Nhw7dgyAvb29gesvNWDPnj0CgUAkEhns1D93075YLM7Pz1c3njhxwszMrGfPnoaJofGqq6u5KgZpaWm8BKCebxk9ejTVAdUrSqPPDE9PTwA//fQT34EwxlhmZiZ37++aNWsM2e+YMWMArFy5Ut1SWVnZtm1bAH/88YchI2mM+fPno5469bGxsf379582bdrq1av379+flZWl2zpOSqVy+PDhAHx8fMrLy3X4ZFIbpdFnRnR0NIDQ0FC+A+Gt5BFj7OeffwbQrVs3zeHVrFmzjPNEU3p6OoDWrVvX3qzG7X5teL9Xc05/ffTRR9x8i3EepnrO0H2jz4w7d+506tSJMZaXl8cdbeKFSqUaNmzYgQMH/Pz8jh8/zt2XbMjeXVxc8vLyjh49ytVlA3Dx4kVfX19bW9v8/HxjuyuzT58+Z86c2bp1K3e0Se3OnTvp6ekymSwjI0Mmk0mlUs3b6TkCgaBz587u7u6enp4eHh7cD3VuudWSlJQUGhoqFAp/+umnV199VZefh9SJ7zxOmoC7JtmQpYNrW7BgAYAOHTrwVQp08eLFAMLDwzUbuWuSeSz2V5/Y2FjUU1ZLS2lpaVpa2tatWxctWjRmzBgvL686C8bY2Nj06dMnIiIiNze3zudkZGRw8y1GeKPN84rS6LMkKSkJgLu7O18BcJeKSiSSw4cP8xVDdna2QCAwNzfX3En+xRdfABgyZAhfUdWnrKzMyspKIBA8xWaGhk9/1XnFqnq+ZdKkSboInzQKpdFniUKhcHBwAHDq1Knar/r7+z/dKfVGUpc8+vrrr3X42KfA3XgfFxenbikuLjY3NxcKhfWN0XgUHh4OYMSIEWfPnm3+7lru9FdcXFztxfeampqhQ4cC8PPzM+ajw88fSqPPmPfffx/A22+/rdVeVVUlFou1vgByqxYhISGzZ8+u75R6I927d4+ruDl58uRmf4jm2rp1K4CAgADNxokTJwL49NNP+YqqPgsXLuQutFZ/Kw8MDIyMjIyOjk5OTtbhGj23MYDH+ZYWi5aYnjFXrlzx8PCwtLQsKCiwsrLSfKm4uDg7O/vy5csZGRncD1KpVKVSaT3BxsbGy8vL29vb1dWV+8HFxUUobKjUtkKhGDx48OHDh/v27Xvo0CHel3EqKys7duxYUlJy4cIFHx8frjE1NXXQoEEuLi5ZWVkNfxxDOn78+MCBA+Vyeb9+/SoqKqRSaVVVldZ7rK2t3d3dPTw8PD09uR+6devW1Era27dvnzRpkkQiSUlJCQ4O1t0nII3Adx4nTRYYGAhg8+bNT3zngwcPzp8/v2PHjo8//nj8+PG+vr5alXY41tbWPXv2fP/99+t7zowZMwA4ODho7nvn1zvvvANgPnepJWOMMZVK5ebmBiA1NZXHwDSpSx4t4G6NY4wxlp+fn5KSEhsbO3v27JCQEFdX19q/EbFYrPk1IiUlpXaFZE3q+RYDlxQkHEqjz55NmzYB6N+//9P98fr+Gg8fPrzO93NVi83MzIzq6ui0tDQAtra2mgVBP/30UwATJ07kMTA1dcmjkJCQhs+eFRcXa9aV8/LyqrOkto2Njb+/f1hYWHR0dHx8fHp6Onfl3e3btzt16gTjmG9pmSiNPnvKy8u5urjLli07efJkUVFRMx94796948eP15klT548aZwljxhjvr6+ePymkry8PJFIZGZm1vz/T5ovIiICTS159LeqqqpLly7t2rVr2bJlb7zxhr+/v9YEDsfc3NzPz8/JyQlAYGCgcdYCaAkojT57ysrK7O3tuQFIw+OUZrp16xZX8mju3LnNf5rOxcTEAHjttdc0GwcPHgzgyy+/5Csqzpo1a6CTkkcaioqKjh07FhsbGxUVNWzYMFdXV+6G1hdffDEgIKDhb/1Er2iJ6RnDGJswYcKuXbs6duwYFBSUlZUlk8nKy8u13mZubs4tVqi5u7vXOTFan6qqqgEDBpw5c2bgwIEHDx6svQ2Ad4WFhY6OjgqFIjc3V/2PSnx8/IQJE3x8fC5cuMBXYP/73/9effVVpVK5c+fO8ePH66+j+/fvy2Sympqafv366a8X8mR85/FnSn3FuA2Iu1Zd6wre+sYpWhwcHEJCQiIjI2NiYlJSUrKyshroiCvDa8wljxhjXJLSvAWuurrazs4OwPnz53kJKScnhwtgyZIlvARADI/SaFPUV4zbUA4ePNjIK3hLSko0Vy0aWVdOPRvwn//8B0Zf8ogxdvDgQQBdunTR3Is+e/ZsALNmzTJ8PGVlZS+88AKAESNG6PbGJmLMKI02WgN1uwxCfQXvihUrnuKPy+VyqVSamJi4cuXK8PDw3r17t27dunZiNTU17datm0gk0n0ZXj1QKpXOzs4ADh06pG68ePEi9y9ERUWFQaNRqd1rXCYAAAt/SURBVGZFRADw8PDQRy0AYrQojTZaA8W4GWMpKUyfN0GUlpZ6eXkBCA0N1eEVvLVnA7iN65MnT35WvpNyN/CHhYVpNvbs2ROAoSvfLVv2l63tyMBAmboSEWkZKI02WgPFuEtKmK0tA9hbbzGdHmPnKJXKYcOGwSBX8JaXl587d+7evXt67UWHcnJyhEKh1k0lX331FYAQrd+XXh08yEQiJhQyKnnU8lAabbSGv9Tv28datWIA8/Njur4dg7sajq7grc/AgQPx+IUpJSUlFhYWAoGg4WU0nZFKWZs2DGAa1/KTloPSaFPUV4ybI5Uyd3cGMDs79ttvuuozMTGRK3l04MABXT3zObN9+3YAvXr10mxcuXLlli1bDDE9WlrKvLwYwEJDGZU8apEojTZFfcW41QoL2aBBDGBiMYuObn6HUukl7vgKXcHbgMrKSu4KpT///NPQfSuVbNgwBjAfH0Ylj1oqSqPNsG8fi4jQngytqWFRUQxgAIuMZM04n6dQFF661H3TpmC6gveJZs6cCV5OWy1axADWti2j+ZYWjE4xPa2qKri54dYtBARg9244Oj726s6dmDoVFRUIDERCAppeOomxmmvXhpaWplpa9ura9ahY3IQDSC3Q+fPn/f39DV2Oac8ejBkDoRD792PIEAN1SoyPsVzL+OwxM8OBA3B1xZkz8PPDkSOPvfrPf+LECbi44NqVLOnrDx6cberj8/PfLy1NlUg6uLomUg59opdeesnPz6+wsDA5OdlAXV68iLAwMIa1aymHtnCURpvBxwdpaQgJwd27GDwY33772KsvvojTp+9sGlRiff7KleDCwq2Nf3BR0bY7d9YJBBJX13gTEycdh/2cmjJlCgDuFkG9KypCaCgePEBYGGbPNkSPxIjRl/pmUyqxeDFWrQKAyEh88QU07i1nrObWrY9u314FwM4u0tn5S4FA0vDzKir+kMmCVKqKzp1j7ewi9Rn6c6WoqMjR0VEgEPj4+PTo0UN9n7yLi4vu71X5/HNERaFXLxw9iqZc+EKeS5RGdWTHDrz9dn2ToffufXPjxizG5FZWL7u57RKL29f3GIXijlTaSy7Pa9fuHWfnr/Uf93PlzJkzERERGRkZmo0SiaRTp06adVN8fX25C1ufHmNYvx5jxsCJvisQSqM6lJaG0FDcvAlnZ/ZTkuAFP80Xy8tPZmePVSgKTEw6ubntsbDwr/0AxhRXrw4qKztiZdWve/dDAkHTqvEQALdv387MzJTJZJmZmVKpVCaTcfXdtN42LTAwztwcHh7w9IS7Ozw90bEjLwGT5wClUZ26dw/jxkGWKd1m1s73E1vbyZovKhS3srJCHzw4IxRaurh8b2MzVutP37jxzt27sRJJR0/PNImE/lbrhlwuv3r1qrrMX0ZGhlQqjfb1nXXy5GPvMzWFmxu8veHlBW9vuLrCywvctVilpZg3DwcPgjG8+CLWr0fXrrx8FmKcKI3qmlx+7/zH1yWrAHTosNDRMVogeFRXR6WqunFjemHhD4DA0XGZvf0i9UuFhd/n5k4RCs26dz9qadmLh8hbDKVS+eD69VZSKTIyIJNBKkVmJgoLtd8nkcDVFdu3Y/lytG+PL76AWIxvv8XKlcjMBN/lUYnxoDSqF/fuxd248S5jcmvrYFfXXWJxu1qvznZz29W69XCu5cGDszJZf8bkLi4/2NqG8RFyi1dcjOxsXL6MjIyHP8hkUCrxyy+YNAk3bjxaSho0CG+8gSlTeA2XGBFKo/pSXn4iO3usQnHb1NTNzS3J3LyH5qty+Q0TE2f1f6pUVdevT5NI2js5rTF4pKQeVVWQySCTIS4OqamP2j/6CJWVWEO/KfIQ7RvVFyurQE/Pc5aWvaurs6TSvsXFuzVf1cyhAIRCsy5dfnB0/NywMZIGmZnB1xcAtCqyMKbdQlo2SqN6JJE4ursftbWdrFKVZ2ePy8//AFBxL929u/HyZff09K6XL3vcu8ft2xdozqISY/HCC7hwAVVVj1rOnoW3N38BEaNDX+oN4c6dNfn5UYwpbW0nu7hsrqqSXrkS4uV1Xixur1SWyeU55uY+fMdI6jdqFBwcsH79wyWmFSuQmUm77okajUYNoUOHBd26/U8isbexGQ9AoSgQi21EIlsAIpG1Zg6tqPijujqbt0BJnb7/HlVV6NwZjo7YvRu//EI5lGii0ajhqFTlQqEVAMbkV68Ora7ObtVqYKtWg2xsxnH/nikUd6TSnipVRZcuO1u1GsR3vISQRqHRqOFwORSAQGDSvfv/unZNMjd/oaBgeU7OpL/fYGFh0aumpujataHcMXxCiPGj0SjP5PKb6ekufn7Vf68vsdu3P8/PXwSo2rad2Lnzt0KhBc8hEkIaRKNRQysvP1ldfbW8/OFJxAcPTkoknTTW6AX29lFdu+4ViVoVFe2QyYLk8ut8hUoIaQwajRrU/fv7r10b0br1UMaqq6quCAQSsbi9nd1kU9Nu1tavaL6zqkqWlTWyqkomFtu5uu6yth7AU8iEkCegNGo4VVVXpNIApbLE0XGFvf2HXKNCcTsz88WamkInp7Xt27+r+f6amqKcnH+WlqYIBGInpzXt29P1wIQYI/pSbyBKZVlW1milsqRNm1B7+w/U7RJJh/bt5zGmzMubnZMzSaWqVL8kFrft2vXnDh3mM1Zz58oS1ccLIZfzETshpCE0GjUM1bVrI+/f/8nc3MfD46RQaKn1cnHxrtzcKSrVAwuLl9zc9mgdFS0q2mY9ZaMk+QSCgpCQgA4dDBg5IeQJKI0awq1bHxUULBeL23p4nDU1davzPZWVF7OyRlVX54jF7Vxdd1lbBz/28p9/YtQoXL8OR0ckJqJ3b0PETQhpBPpSr3clJXsKClYIBKIuXbbXl0MBmJv7eHiktWoVUlNz9+rVwX8ftP/biy/i3Dm88gry8/Hyy9i8We9xE0Iah9KoflVVZebmTgaYk9OaVq1ebfjNYrFt164H7e2jGJNfvz7t+vXpjGlMhtrZ4ddfERWF6mpERGD6dCgUeg2eENIYlEb1qahINH2huFRka/tW+/ZzGvMnBAKRo2O0i8v3QqFZWW4Cm/RP/PXXo5fFYkRHIzYWJiaIi0NIyGOvEkL4QHOjelNTg6FDkZqqGvs6/psgFDbtMosHD86aRCyWxKfC2Rl79uCllx57+eRJjB2LggJ06oQ9e+BfR4E8Qohh0GhUb95/H6mp6NBBuG5jU3MoAEvL3pIvf8SAAbhxA4GB+P77x17u1w9nz6JXL+Tl4fJlXYVMCHkKNBrVj23bEBYGiQSpqXj55ad/Tk0NFizA+vUAEBmJDRsgFj96taoKe/Zg4sTmRksIaQZKo3rwxx8ICkJFBWJjERmpgwfGxeHddyGXIzgYu3ahXbsn/xFCiKHQl3pdu3MHI0eiogIzZugmhwKIjMRvv8HeHkeOoG9fpKc/eqm0FFOnwtERHTvitddw7ZpueiSENBqlUZ1SKDBhAvLy0K8fYmJ0+eTAQJw9C39/ZGWhXz8kJT1snzwZEglyc5Gfj9GjMXgwqqt12S8h5EkojerUxx/jyBE4OSExESYmOn54p044cQKTJ6O8/GGuzMzE8eOIiYFEAoEA06bBzQ0//qjjfgkhDaI0qlOzZ+OVV7Bnj76OvZuaYvNmHD2KCRMAID0dPj6P1QUKCHjsKz8hRP/ET34LaTwHB/z2m957CQp6+EPtgulUQp0Qg6PRaBPVt6RjZoby8oc/nzuHHj0MEQyVUCfECFAabSKjWtLx9ES/fpg3DwoFGMM33+DaNdpGSoiBURptCiNc0qES6oTwjeZGm6LhJR1v74fzknI52rY1UEht2tCleYTwi0ajTdHwks7ly8jNRW4ukpMNHxohhC+URpuClnQIIbVQGm0KWtIhhNRCabSJaEmHEPI4uuGJEEKahUajhBDSLP8HtIbS4lfi5vcAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x7f9394ebf940>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(best_scores[0])\n",
    "best_mols[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.98874843\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x7f9394e7abc0>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(best_scores[0])\n",
    "best_mols[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.98874843\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x7f9394e818f0>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(best_scores[0])\n",
    "best_mols[2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.98874843\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<rdkit.Chem.rdchem.Mol at 0x7f9394e81990>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(best_scores[0])\n",
    "best_mols[3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The screen seems to favor molecules with one or multiple sulfur trioxides. The top scoring molecules also have low diversity.  When creating a \"buy list\" we want to optimize for more things than just activity, for instance diversity and drug like MPO. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Congratulations! Time to join the Community!\n",
    "\n",
    "Congratulations on completing this tutorial notebook! If you enjoyed working through the tutorial, and want to continue working with DeepChem, we encourage you to finish the rest of the tutorials in this series. You can also help the DeepChem community in the following ways:\n",
    "\n",
    "## Star DeepChem on [GitHub](https://github.com/deepchem/deepchem)\n",
    "This helps build awareness of the DeepChem project and the tools for open source drug discovery that we're trying to build.\n",
    "\n",
    "## Join the DeepChem Gitter\n",
    "The DeepChem [Gitter](https://gitter.im/deepchem/Lobby) hosts a number of scientists, developers, and enthusiasts interested in deep learning for the life sciences. Join the conversation!"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
